package com.wander.designBehavioral.command;

/**
 * 1）参数化配置
 * 所谓命令模式的参数化配置，指的是：可以用不同的命令对象，去参数化配置客户的请求。
 * 即：对于Invoker的同一个请求，为其配置不同的Command对象，就会执行不同的功能。
 * Invoker 的作用在于管理和调用 Command 对象,可以简化客户端调用 Command 对象的过程，
 * 使客户端代码更清晰，更易于维护。
 *
 * @author WDYin
 * @date 2023/5/26
 **/
public class MyClient {
    public static void main(String[] args) {
        // 创建接收者
        Light light = new Light();

        // 创建命令对象，设定它的接收者
        Command lightOnCommand = new LightOnCommand(light);
        Command lightOffCommand = new LightOffCommand(light);

        /**
         * 直接使用命令对象也可以实现
         * 但是使用 Invoker 时，客户端只需要知道 Invoker 和 Command 接口，
         * 并不需要知道具体的命令实现。这使得我们可以轻松地替换命令，而不需要更改客户端代码。
         * Invoker 的作用在于管理和调用 Command 对象
         * 可以简化客户端调用 Command 对象的过程，使客户端代码更清晰，更易于维护
         */
        Invoker invoker = new Invoker();
        invoker.setCommand(lightOnCommand);

        // 调用者调用命令
        invoker.invoke();

        // 调用者调用命令
        invoker.setCommand(lightOffCommand);
        invoker.invoke();
    }
}
